#include "netdisk.h"

// 实现文件的上传功能

// 接收客户端指定的文件路径，创建或打开对应的文件，并将客户端发送的文件内容写入该文件
// const char *arg：客户端指定的文件路径
int putsTextFunc(const char* arg,int netfd, Stack_t dir){//输入差一个栈参数，后面可以补上   
    // 根据用户输入的文件，已经栈中已有路径，拼接生成绝对路径，并存储到read_packet
    char real_path[4096];
    onePath(arg, real_path, &dir);

    puts(real_path); // 将计算后的绝对路径打印到标准输出，便于调试
    
    // 初始化传输结构体
    tran_t train; // 接收客户端发送的数据
    bzero(&train,sizeof(train));
    // recvn(netfd,&train.length,sizeof(train.length));//接收文件名火车头
    // recvn(netfd,train.data,train.length);//接收文件火车箱
    char filename[1024] = {0};
    // cutstr(real_path, filename);
    //if(isInThisList(filename)==1){//判断当前目录下是否存在相同文件，如果存在则上传或下载文件名为（文件名_copy）
    //    char cp[4096]="copy_";
    //    char* thename=real_path;
    //    //sprintf(train.data, "%s%s",thename,cp);
    //    strcat(cp, real_path);
    //    strcpy(real_path, cp);
    //    int fd = open(real_path, O_WRONLY|O_CREAT,0666);
    //    printf("fd = %d\n", fd);
    //    if(fd == -1){
    //        char error[] = "wrong argument.";
    //        int error_length = strlen(error);
    //        send(netfd, &fd, sizeof(int), MSG_NOSIGNAL);
    //        send(netfd, &error_length, sizeof(int), MSG_NOSIGNAL);
    //        send(netfd, error, error_length, MSG_NOSIGNAL);
    //    }
    //    while(1){
    //        bzero(&train,sizeof(train));
    //        recvn(netfd,&train.length,sizeof(train.length));
    //        if(train.length==0){
    //            break;
    //        }
    //        recvn(netfd,train.data,train.length);
    //        write(fd,train.data,train.length);
    //    }
    //}
    //else{

    // 以只写模式，并且若是文件存在，则覆盖重写，若文件不存在则创建新文件，且介iang文件权限设置为索引用户都可以读写该文件
    int fd = open(real_path, O_WRONLY|O_TRUNC|O_CREAT,0666);
    // 错误信息处理
    if(fd == -1){
        char error[] = "wrong argument.";
        int error_length = strlen(error);
        send(netfd, &fd, sizeof(int), MSG_NOSIGNAL); // 发送文件描述符fd（此时为-1）
        send(netfd, &error_length, sizeof(int), MSG_NOSIGNAL); // 发送错误信息的长度
        send(netfd, error, error_length, MSG_NOSIGNAL); // 最后发送错误信息内容
    }else{
        // 若是文件打开成功，则想客户端发送成功符
        int ret = 0;
        send(netfd, &ret, sizeof(int), MSG_NOSIGNAL);
    }
    // bzero(&train,sizeof(train));


    // 使用循环接收客户端发送的文件内容：
    while(1){
        bzero(&train,sizeof(train)); // 每次接收，先清零 train 结构体
        // 接收 
        recvn(netfd,&train.length,sizeof(train.length));
        if(train.length==0){
            break;
        }
        recvn(netfd,train.data,train.length);
        write(fd,train.data,train.length);
    }
    //}
    return 0;
}
